package com.ittao.taoaicodemother.core.handler;

import com.ittao.taoaicodemother.model.entity.User;
import com.ittao.taoaicodemother.model.enums.ChatHistoryMessageTypeEnum;
import com.ittao.taoaicodemother.service.ChatHistoryService;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;

/**
 * 简单文本流处理器
 * 处理 HTML 和 MULTI_FILE 类型的流式响应
 */
@Slf4j
public class SimpleTextStreamHandler {

    /**
     * 处理 AI 返回的代码流
     * @param originCodeFlux AI 返回的代码流
     * @param chatHistoryService 对话历史服务
     * @param appId 应用 ID
     * @param loginUser 登录用户
     * @return 处理后的代码流
     */
    public Flux<String> handle(Flux<String> originCodeFlux,
                               ChatHistoryService chatHistoryService,
                               Long appId, User loginUser) {
        // 9. 收集 AI 响应的内容，并且在完成后保存记录到对话历史
        // 字符串拼接器，用于当流式返回所有的代码之后，再保存代码
        StringBuilder aiResponseBuilder = new StringBuilder();
        return originCodeFlux.map(chunk -> {
            // 实时收集代码片段
            aiResponseBuilder.append(chunk);
            return chunk;
        }).doOnComplete(() -> {
            // 流式返回完成后，保存 AI 消消息到对话历史中
            String aiResponse = aiResponseBuilder.toString();
            chatHistoryService.addChatMessage(appId, aiResponse, ChatHistoryMessageTypeEnum.AI.getValue(), loginUser.getId());
        }).doOnError(error -> {
            // AI 回复失败，也需要保存记录到数据库中，但只记录用户友好的错误信息
            String errorMessage;
            if ("InvalidRequestException".equals(error.getClass().getSimpleName())) {
                // 处理 InvalidRequestException，检查是否为余额不足错误
                String message = error.getMessage();
                if (message != null && (message.contains("400 Bad Request") || 
                                       message.contains("Arrearage") || 
                                       message.contains("Access denied, please make sure your account is in good standing"))) {
                    errorMessage = "AI 服务余额不足，请联系管理员充值";
                } else {
                    errorMessage = "AI 服务调用失败，请稍后重试";
                }
            } else {
                errorMessage = "AI 生成代码失败，请稍后重试";
            }
            chatHistoryService.addChatMessage(appId, errorMessage, ChatHistoryMessageTypeEnum.AI.getValue(), loginUser.getId());
        });
    }
}
